9. 微调(Fine-tuning)的数学原理
大模型微调(Fine-tuning)的本质:
是通过数学优化,让模型预测更接近正确答案。
虽然大模型看起来像:
- 聊天
- 推理
- 写代码
但底层本质上仍然是:
神经网络参数优化问题。
1. 神经网络训练的核心流程
训练过程本质上是:
输入数据
→ 模型预测
→ 计算误差
→ 调整参数
→ 再次预测
不断循环。
2. 微调训练完整流程
graph TD A[训练数据 Input/Output] --> B[Tokenizer 分词] B --> C[输入模型] C --> D[预测下一个 Token 概率] D --> E[计算 Loss 损失函数] E --> F[Backward 反向传播] F --> G[计算梯度 Gradient] G --> H[Optimizer 更新参数] H --> I[模型权重更新] I --> J[继续下一轮训练]
3. 微调训练的核心步骤
通常包括:
| 步骤 | 作用 |
|---|---|
| 添加训练数据 | 教模型学习任务 |
| 前向传播(Forward) | 模型预测结果 |
| 计算损失(Loss) | 判断预测是否正确 |
| 反向传播(Backward) | 计算参数如何调整 |
| Optimizer 更新权重 | 让模型变得更好 |
| 多轮训练(Epoch) | 持续优化模型 |
4. 添加训练数据
例如:
input:
中国的首都是哪里?
output:
北京
模型目标:
预测出 “北京”。
5. 模型输出的本质
模型并不是直接输出:
北京
而是输出:
整个词表上的概率分布。
例如:
| Token | 概率 |
|---|---|
| 北京 | 0.7 |
| 上海 | 0.2 |
| 东京 | 0.1 |
6. Loss(损失函数)
Loss 用于衡量:
模型预测有多“错误”。
7. Cross Entropy(交叉熵)
大模型最常见的 Loss 是:
Cross Entropy Loss(交叉熵损失)
它的作用:
比较“预测概率”和“正确答案”的差距。
8. 交叉熵的直觉理解
如果正确答案是:
北京
情况1:预测正确
| Token | 概率 |
|---|---|
| 北京 | 0.95 |
Loss:
很小
说明模型预测很好。
情况2:预测错误
| Token | 概率 |
|---|---|
| 上海 | 0.8 |
| 北京 | 0.1 |
Loss:
很大
说明模型预测错误。
9. Loss 的目标
训练目标就是:
让 Loss 越来越小。
即:
预测越来越接近正确答案
10. Forward(前向传播)
前向传播:
模型从输入一路计算到输出。
过程包括:
Input
→ Embedding
→ Transformer
→ Logits
→ Probability
11. Backward(反向传播)
计算完 Loss 后,
模型需要知道:
“哪里错了”。
这一步叫:
Backpropagation(反向传播)
12. 反向传播做了什么
它会从 Loss 开始:
反向计算每个参数对错误的影响。
即:
哪个参数导致预测错误?
13. Gradient(梯度)是什么
梯度(Gradient)本质上是:
参数应该往哪个方向调整。
可以理解为:
“修正建议”
14. 梯度的直觉理解
例如:
模型预测:
上海
但正确答案是:
北京
梯度会告诉模型:
减少“上海”的概率
增加“北京”的概率
15. 参数更新流程
graph LR A[模型预测错误] --> B[计算 Loss] B --> C[Backward 计算梯度] C --> D[Optimizer 更新参数] D --> E[模型预测更准确]
16. Optimizer(优化器)
Optimizer 的作用:
根据梯度更新模型参数。
即:
参数 = 参数 - 学习率 × 梯度
17. SGD(随机梯度下降)
最经典优化器:
SGD(Stochastic Gradient Descent)
思想很简单:
哪里错了
→ 就往反方向修正
18. 学习率(Learning Rate)
Learning Rate 决定:
每次参数调整幅度。
学习率太小
训练非常慢
学习率太大
训练不稳定
甚至发散
19. 大模型常用优化器
现代 LLM 很少直接使用 SGD。
更常见:
- Adam
- AdamW
20. Adam 的核心思想
Adam 会自动:
- 调整不同参数学习速度
- 平滑梯度变化
- 提升训练稳定性
因此:
Adam 更适合超大模型训练。
21. AdamW
AdamW 是 Adam 的改进版。
特点:
更好的 Weight Decay(权重衰减)
它能有效:
- 防止过拟合
- 提升泛化能力
目前:
AdamW 是 LLM 微调最常见优化器之一。
22. Parallel Training(并行训练)
大模型参数巨大:
7B
70B
100B+
单卡无法训练。
因此需要:
并行计算(Parallel Training)
23. 常见并行方式
| 类型 | 作用 |
|---|---|
| Data Parallel | 数据并行 |
| Tensor Parallel | 张量并行 |
| Pipeline Parallel | 流水线并行 |
24. 梯度爆炸(Gradient Explosion)
训练中可能出现:
Gradient 非常大
导致:
- Loss 爆炸
- 参数崩坏
- 模型 NaN
25. 如何防止梯度爆炸
常见方法:
Gradient Clipping(梯度裁剪)
例如:
限制梯度最大值
避免更新过大。
26. 如何防止过拟合(Overfitting)
过拟合:
模型记住训练集,
但不会泛化。
27. 常见防止过拟合方法
| 方法 | 作用 |
|---|---|
| 更多数据 | 提升泛化 |
| Dropout | 增加随机性 |
| Weight Decay | 限制参数过大 |
| Early Stopping | 提前停止训练 |
| 验证集评估 | 监控泛化能力 |
28. Epoch 是什么
Epoch:
模型完整学习一遍训练集。
例如:
epoch = 1
表示:
所有训练数据都训练了一轮。
29. 训练代码示例(HuggingFace)
trainer = SFTTrainer(
model=model,
args=args,
train_dataset=train_dataset,
eval_dataset=eval_dataset
)
for epoch in range(num_epochs):
trainer.train()
30. 训练中的关键步骤
loss.backward()
optimizer.step()
optimizer.zero_grad()
31. backward()
loss.backward()
作用:
计算梯度。
32. optimizer.step()
optimizer.step()
作用:
更新模型参数。
33. optimizer.zero_grad()
optimizer.zero_grad()
作用:
清空旧梯度。
否则梯度会不断累积。
34. HuggingFace 可视化训练
训练过程中通常会观察:
- Loss 曲线
- Learning Rate
- Weight 更新
- Gradient 大小
用于判断:
- 是否收敛
- 是否过拟合
- 是否训练稳定
35. 微调训练的本质
整个 Fine-tuning 的本质:
不断预测
→ 计算错误
→ 修正参数
→ 预测更准确
循环上亿次。
36. 一句话总结
Loss:
衡量模型错得多严重。
Gradient:
告诉模型该怎么改。
Optimizer:
负责真正修改参数。
Fine-tuning:
本质上是一个不断“减少错误”的数学优化过程。